三維幾何-基礎

數學上,三維幾何是3維歐式空間幾何的傳統名稱。因爲實際上這大致就是我們生活的空間。

我們在前面介紹過向量運算,其中很多內容也適合三維幾何,如點+向量=點,向量+向量=向量,點+點沒有定義。

首先是輔助宏的定義:

const double eps = 1e-10;
const double PI = acos(-1);  // π
const double TWO_PI = 2*PI;
const int maxn = 100 + 5;
const int INF = 10000;

三維點的定義:

struct Point3
{
    double x, y, z;
    Point3(double x = 0, double y = 0, double z = 0):x(x), y(y), z(z){}
};
typedef Point3 Vector3;    

向量操作:

Vector3 operator + (const Vector3 &A,const Vector3 &B)
{
    return Vector3(A.x+B.x, A.y+B.y, A.z+B.z);
}
Vector3 operator - (const Vector3 &A,const Vector3 &B)
{
    return Vector3(A.x-B.x, A.y-B.y, A.z-B.z);
}
Vector3 operator * (const Vector3 &A, double p)
{
    return Vector3(A.x*p, A.y*p, A.z*p);
}
Vector3 operator / (const Vector3 &A, double p)
{
    return Vector3(A.x/p, A.y/p, A.z/p);
}
bool operator == (const Vector3 &A,const Vector3 &B)
{
    return (dcmp(A.x - B.x) == 0) && (dcmp(A.y - B.y) == 0) && (dcmp(A.z - B.z) == 0);
}

三維點積的定義和二維非常類似,而且也能用點積計算向量的長度和夾角。

double Dot(const Vector3 &A,const Vector3 &B)
{
    return A.x*B.x + A.y*B.y + A.z*B.z;
}

向量的長度

double Length(const Vector3 &A)
{
    return sqrt(Dot(A, A));
}

向量的夾角

double Angle(const Vector3 &A,const Vector3 &B)
{
    return acos(Dot(A, B) / Length(A) / Length(B));
}

三維叉積:

三維空間裏也有叉積的概念,但形式和二維叉積大不一樣,它是一個向量,而不再是一個帶符號的數。

v1 * v2 =

y1z2 - y2z1

z1x2 - z2x1

x1y2 - x2y1

一種在學術上不太嚴謹的說法,可以認爲叉積同時垂直於v1和v2,方向遵循右手定則。當且僅當v1和v2平行時,叉積是0。

Vector3 Cross(const Vector3 &A,const Vector3 &B)
{
    return Vector3(A.y*B.z - B.y*A.z, A.z*B.x - B.z*A.x, A.x*B.y - B.x*A.y);
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章